package 位运算;
public class 只出现一次的数字III5 {
    //https://leetcode.cn/problems/single-number-iii/description/
    public int[] singleNumbererr(int[] nums) {
        int sum = 0;
        for (int num : nums) sum ^= num;
        int a = 0;
        for (int i = 0; i < nums.length - 1; i++) // 最后两个连续出现 出现两次的消不完
            a ^= nums[i];
        int b = sum ^ a;
        return new int[]{a, b};
    }
    public int[] singleNumber(int[] nums) {
        int sum = 0;
        for (int i : nums) sum ^= i; // sum:两个不同数的^和
        int tmp1 = sum & -sum;  // a和b不同，肯定有一位比特位为1，tmp1:右首1提纯数
        // 各只出现1次的 不同的 两个数 和1位 肯定不同，一个是0 一个是1，各分开在 此位为01的 2组中，其余出现2次的 都各成对分布在两组中 和为0，分开来两组消和 两不同数各出
        int[] ret = new int[2];
        for (int i : nums) {
            //if((i & tmp1) == 0)
            if((i & tmp1) != 0) // 右首1这位 为1的 这组，两个不同数的其中一个 这位是1的 分到这组
                ret[0] ^= i;
            else ret[1] ^= i; // 右首1这位 为0的 这组，两个不同数的其中一个 这位是0的 分到这组
        }
        return ret;
    }
}
